package acme.bloodtime.dao;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import modelo.IPropiedadDAO;
import modelo.IPropiedadDO;
import modelo.IPropiedadVampiroDAO;
import dao.api.DataObject;
import dao.api.FactoryDAO;

/**
 * 
 * @author Armando G. Lozada N.
 * 
 */
public class PropiedadDAO extends BloodTimeBaseDAO implements IPropiedadDAO {

    public PropiedadDAO() {
        // empty
    }

    public void createTable() throws SQLException {
        StringBuffer strbuf;

        // ----------------------------------------

        dropTable();

        // ----------------------------------------

        strbuf = new StringBuffer();

        strbuf.append("CREATE TABLE ");
        strbuf.append(getTableName());
        strbuf.append(" (");
        strbuf.append(PropiedadDO.ID);
        strbuf.append(" SERIAL PRIMARY KEY, ");
        strbuf.append(PropiedadDO.NOMBRE);
        strbuf.append(" VARCHAR(15),    ");
        strbuf.append(PropiedadDO.DESCRIPCION);
        strbuf.append(" VARCHAR(100),     ");
        strbuf.append(PropiedadDO.IMAGEN);
        strbuf.append(" BYTEA,      ");
        strbuf.append(PropiedadDO.PRECIO_COMPRA);
        strbuf.append(" NUMERIC, ");
        strbuf.append(PropiedadDO.PRECIO_VENTA);
        strbuf.append(" NUMERIC, ");
        strbuf.append(PropiedadDO.MIN_ESCLAVOS);
        strbuf.append(" INT , ");
        strbuf.append(PropiedadDO.GANANCIA_SANGRE);
        strbuf.append(" INT ,");
        strbuf.append(PropiedadDO.GANANCIA_DINERO);
        strbuf.append(" NUMERIC ");
        strbuf.append(")");

        System.err.println(strbuf.toString());

        connection.createStatement().execute(strbuf.toString());

    }

    // --------------------------------------------------------------------------------

    @Override
    public void insert(DataObject dataObject) throws SQLException {
        checkCache(dataObject, CHECK_INSERT);
        checkClass(dataObject, PropiedadDO.class, CHECK_INSERT);

        PropiedadDO propiedadDO = (PropiedadDO) dataObject;

        propiedadDO.setId(getNextId());

        StringBuffer strbuf = new StringBuffer();

        strbuf.append("INSERT INTO ");
        strbuf.append(getTableName());
        strbuf.append(" VALUES (");
        strbuf.append(propiedadDO.getId());
        strbuf.append(", ");
        strbuf.append(singleQuotes(propiedadDO.getNombre()));
        strbuf.append(", ");
        strbuf.append(singleQuotes(propiedadDO.getDescripcion()));
        strbuf.append(", ");
        strbuf.append("?, ");
        strbuf.append(propiedadDO.getPrecioCompra());
        strbuf.append(", ");
        strbuf.append(propiedadDO.getPrecioVenta());
        strbuf.append(", ");
        strbuf.append(propiedadDO.getMinEsclavos());
        strbuf.append(", ");
        strbuf.append(propiedadDO.getGananciaSangre());
        strbuf.append(", ");
        strbuf.append(propiedadDO.getGananciaDinero());
        strbuf.append(")");

        // ---------------------------------------------------------------
        // The PreparedStatement is used to do the insertion of the image
        // ---------------------------------------------------------------

        PreparedStatement ps = connection.prepareStatement(strbuf.toString());
        ps.setBytes(1, propiedadDO.getImagen());

        ps.executeUpdate();
        ps.close();

        System.err.println(strbuf.toString());

        dtaSession.add(dataObject);
    }

    // --------------------------------------------------------------------------------

    @Override
    public void update(DataObject dataObject) throws SQLException {
        checkCache(dataObject, CHECK_UPDATE);
        checkClass(dataObject, PropiedadDO.class, CHECK_UPDATE);

        PropiedadDO propiedadDO = (PropiedadDO) dataObject;

        StringBuffer strbuf = new StringBuffer();

        strbuf.append("UPDATE ");
        strbuf.append(getTableName());
        strbuf.append(" SET ");

        strbuf.append(PropiedadDO.NOMBRE);
        strbuf.append(" = ");
        strbuf.append(singleQuotes(propiedadDO.getNombre()));

        strbuf.append(", ");

        strbuf.append(PropiedadDO.DESCRIPCION);
        strbuf.append(" = ");
        strbuf.append(singleQuotes(propiedadDO.getDescripcion()));

        strbuf.append(", ");

        strbuf.append(PropiedadDO.IMAGEN);
        strbuf.append(" = ");
        strbuf.append(" ? ");

        strbuf.append(", ");

        strbuf.append(PropiedadDO.PRECIO_COMPRA);
        strbuf.append(" = ");
        strbuf.append(propiedadDO.getPrecioCompra());

        strbuf.append(", ");

        strbuf.append(PropiedadDO.PRECIO_VENTA);
        strbuf.append(" = ");
        strbuf.append(propiedadDO.getPrecioVenta());

        strbuf.append(", ");

        strbuf.append(PropiedadDO.MIN_ESCLAVOS);
        strbuf.append(" = ");
        strbuf.append(propiedadDO.getMinEsclavos());

        strbuf.append(", ");

        strbuf.append(PropiedadDO.GANANCIA_SANGRE);
        strbuf.append(" = ");
        strbuf.append(propiedadDO.getGananciaSangre());

        strbuf.append(", ");

        strbuf.append(PropiedadDO.GANANCIA_DINERO);
        strbuf.append(" = ");
        strbuf.append(propiedadDO.getGananciaDinero());

        strbuf.append(" WHERE ");
        strbuf.append(PropiedadDO.ID);
        strbuf.append(" = ");
        strbuf.append(propiedadDO.getId());

        PreparedStatement ps = connection.prepareStatement(strbuf.toString());
        ps.setBytes(1, propiedadDO.getImagen());

        ps.executeUpdate();
        ps.close();

        System.err.println(strbuf.toString());

    }

    // --------------------------------------------------------------------------------

    @Override
    public void delete(DataObject propiedadDO) throws SQLException {
        internalDelete(propiedadDO, PropiedadDO.class);
    }

    // --------------------------------------------------------------------------------

    protected PropiedadDO resultSetToDO(ResultSet rs) throws SQLException {
        PropiedadDO ret = //
        (PropiedadDO) dtaSession.getDtaByKey( //
                PropiedadDO.class, rs.getInt(PropiedadDO.ID));

        if (ret != null) {
            return ret;
        }

        ret = new PropiedadDO();

        ret.setId/*             */(rs.getInt(PropiedadDO.ID));
        ret.setNombre/*         */(rs.getString(PropiedadDO.NOMBRE));
        ret.setDescripcion/*    */(rs.getString(PropiedadDO.DESCRIPCION));
        ret.setImagen/*         */(rs.getBytes(PropiedadDO.IMAGEN));
        ret.setPrecioCompra/*   */(rs.getInt(PropiedadDO.PRECIO_COMPRA));
        ret.setPrecioVenta/*    */(rs.getInt(PropiedadDO.PRECIO_VENTA));
        ret.setMinEsclavos/*    */(rs.getInt(PropiedadDO.MIN_ESCLAVOS));
        ret.setGananciaSangre/* */(rs.getInt(PropiedadDO.GANANCIA_SANGRE));
        ret.setGananciaDinero/* */(rs.getInt(PropiedadDO.GANANCIA_DINERO));

        return (PropiedadDO) dtaSession.add(ret);
    }

    // --------------------------------------------------------------------------------

    public void loadPropiedadVampiroList(IPropiedadDO propiedadDO) throws Exception {
        checkCache(propiedadDO, CHECK_UPDATE);

        IPropiedadVampiroDAO propiedadVampiroDAO = (IPropiedadVampiroDAO) FactoryDAO.getDAO( //
                PropiedadVampiroDAO.class, connectionBean);

        propiedadDO.setPropiedadVampiroList(propiedadVampiroDAO.listByPropiedadId(propiedadDO.getId()));
    }

    @Override
    public byte[] loadImageByPropiedadId(int propiedadId) throws SQLException {
        StringBuffer strbuf = new StringBuffer();

        strbuf.append("SELECT ");
        strbuf.append(PropiedadDO.IMAGEN);
        strbuf.append(" FROM ");
        strbuf.append(getTableName());
        strbuf.append(" WHERE ");
        strbuf.append(PropiedadDO.ID);
        strbuf.append(" = ");
        strbuf.append(propiedadId);

        System.err.println(strbuf.toString());

        ResultSet rs = //
            connection.createStatement().executeQuery(strbuf.toString());
        
        if(rs.next()) {
            return rs.getBytes(PropiedadDO.IMAGEN);
        }
        
        return null;
    }
}